
const { Controller } = require("egg");

class HomeController extends Controller {
    /**
      * 按项目id查询访问表的数据
      * 逻辑是先查后写, 查看项目表里有没有这个项目.
      * 如果没有这个项目则新增这个项目. 并增加一条访问记录
      * 如果有这个项目, 直接增加一条访问记录
      */
    async getHitData() {
        const { ctx } = this;
        ctx.set('Access-Control-Allow-Origin', '*');
        /** 先获取项目的数据 */
        const proData = await this.getProData();
        /** 这一步是判断参数是否错误, 主要为无用户名 */
        if (proData && proData.code == 404) return;
        /** 如果没有该项目, 则新建该项目 */
        if (!proData) return this.pushProData();
        /** 如果有该项目, 则新增一条访问量并查询访问量 */
        const pro_id = parseInt(proData[0].id);

        const isOlny = await this.pushHitData(pro_id);

        const sql = `select * from hit_table where pro_id=${pro_id}`;

        const res = await this.app.mysql.query(sql);

        this.ctx.body = { code: 200, msg: "查询成功", data: res };

        if (isOlny == "notOlny") this.ctx.body.hitMsg = "此用户已记录过";
    }
    /** 
     * 获取项目数据
     * @returns res 查询到的项目数据
     * @returns false 如果没查询到则返回false
     */
    async getProData() {
        /** 传入项目的名称, 用名称在pro_table表里查询是否有该项目 */
        const pro_name = this.ctx.request.body.name;

        if (typeof (pro_name) != "string") return this.ctx.body = { code: 404, msg: "参数错误" };

        const sql = `select id from pro_table where pro_name="${pro_name}"`;

        const res = await this.app.mysql.query(sql);

        return res.length > 0 ? res : false;
    }
    /**
     * 添加项目数据
     */
    async pushProData() {
        /** 传入项目的名称, 用名称在pro_table表里查询是否有该项目 */
        const pro_name = this.ctx.request.body.name;

        if (typeof (pro_name) != "string") this.ctx.body = { code: 404, msg: "参数错误" };

        const value = {};

        value.pro_name = pro_name;

        value.time = new Date().getTime().toString();

        await this.app.mysql.insert("pro_table", value);
        /** 项目创建完成后重新获取项目id */
        await this.getHitData();
    }
    /**
     * 新增访问量
     */
    async pushHitData(id) {
        const value = {};
        /** 
         * 用户的微信openid
         * 如果有openid的话, 那么用户就能增加一次访问量
         */
        const user_openid = this.ctx.request.body.openid;
        if (user_openid) {
            value.user_openid = user_openid;

            const isOlny = await this.olnyOpenId(user_openid);
            
            if (isOlny && isOlny.find(obj => obj.pro_id == id)) return "notOlny";
        }

        /** 如果获取到了用户的ip */
        const user_ip = this.ctx.request.body.ip;
        if (user_ip) value.user_ip = user_ip;
        /** 如果获取到了用户的微信名 */
        const user_name = this.ctx.request.body.user_name;
        if (user_name) value.user_name = user_name;
        /** 如果获取到了用户的性别 */
        const user_sex = this.ctx.request.body.user_sex;
        if (user_sex) value.user_sex = user_sex;
        /** 如果获取到了用户所在城市 */
        const user_city = this.ctx.request.body.user_city;
        if (user_city) value.user_city = user_city;
        /** 如果获取到了用户的微信头像 */
        const user_head = this.ctx.request.body.user_head;
        if (user_head) value.user_head = user_head;

        value.pro_id = id;

        value.time = new Date().getTime().toString();

        await this.app.mysql.insert("hit_table", value);
    }
    /**
     * 如果有openid的话, 那么用户就只能增加一次访问量
     */
    async olnyOpenId(openid) {
        const sql = `select pro_id from hit_table where user_openid="${openid}"`;

        const res = await this.app.mysql.query(sql);

        return res.length > 0 ? res : false;
    }
}

module.exports = HomeController;